'use strict'

const http = require("http");
const url = require("url");
const path = require("path");
const fs = require("fs");

// 从命令行获取root目录 ， 默认是当前目录
var root = path.resolve(process.argv[2] || '.');
console.log("static root dir:" + root);

const utils = {
    handError: (err, req, res) => {
        res.writeHead(404);
        res.end('404 not found');
        console.log(err)
    },
    handSuccess: (filepath, req, res) => {
        // 没有出错，而且文件存在
        res.writeHead('200');
        fs.createReadStream(filepath).pipe(res);
        console.log("200 ok " + req.method + req.url);
    }
}
// 创建 http server
const server = http.createServer((req, res) => {
    var pathname = url.parse(req.url).pathname;
    var filepath = path.join(root, pathname);
    // 获取文件状态
    fs.stat(filepath, (err, stats) => {
        if (err) {
            utils.handError(err, req, res);
        } else if (stats.isFile()) {
            utils.handSuccess(filepath, req, res);
        } else if (stats.isDirectory()) {
            fs.readdir(filepath, (err1, files) => {
                for (let file of files) {
                    if (file === 'index.html' || file === 'default.html') {
                        filepath = path.join(filepath, file);
                        utils.handSuccess(filepath, req, res);
                        return;
                    }
                }
                utils.handError(err1, req, res)
            })
        }
    })
})

server.listen(3000);
console.log("server is runing at 3000");


/**
 * request 对象对象封装了HTTP请求，我们调用request对象的属性和方法就可以拿到所有HTTP请求的信息
 * response 对象封装了HTTP响应，我们操作response对象的方法，就可以把HTTP响应返回给浏览器
 * 
 * 没有必要手动读取文件内容。由于response对象本身是一个Writable Stream ，直接用 pipe() 方法就实现了自动读取
 * 文件内容并输出到HTTP响应
 * 
 * 
 */